package br.com.beautycenter.view;

import br.com.beautycenter.Funcionalidades.Pesquisas;
import br.com.beautycenter.Funcionalidades.Validacoes;
import br.com.beautycenter.bean.Funcionario;
import br.com.beautycenter.bean.Cliente;
import br.com.beautycenter.DAO.PersisteFuncionario;
import br.com.beautycenter.DAO.PersisteCliente;
import java.awt.event.KeyEvent;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.text.MaskFormatter;

public class PesquisarPaciente extends javax.swing.JDialog {

    CadastroCliente cadastroPaciente;
    
    PersisteCliente persistePaciente = new PersisteCliente();
    PersisteFuncionario persisteFuncionario = new PersisteFuncionario();
    
    List<Cliente> listaPacientes = new ArrayList<Cliente>();
    Funcionario funcionario = new Funcionario();
    Cliente paciente = new Cliente();
    
    MaskFormatter mascaraCPF;
    
    int selecao = 0;


    public void inicializarDialog(){
        cadastroPaciente = (CadastroCliente) this.getParent();
        try {
            mascaraCPF = new MaskFormatter("###.###.###-##");
            mascaraCPF.setValidCharacters("0123456789");
            
        } catch (ParseException ex) {
            JOptionPane.showMessageDialog(null, "Erro ao criar máscara!");
        }
    }
    
    /**
     * Veririca primeiro se o valor digitado é um número. Caso seja, consulta no banco de dados se existe o funcionário.
     * @return 
     * <b>true</b> - Localizou o funcionário<br/>
     * <b>false</b> - Valor digitado é inválido ou não achou o funcionário<br/>
     */
    public boolean validarCodigo(){
        if(!txtValor.getText().trim().isEmpty() && Validacoes.validarCampoNumerico(txtValor.getText())){
            paciente = new Cliente();
            paciente.setIdPessoa(Integer.valueOf(txtValor.getText()));
            paciente = persistePaciente.retornarClientePeloID(paciente);
            
            if(paciente != null) return true;
            JOptionPane.showMessageDialog(null, "Paciente não cadastrado no sistema!");
            return false;
        }
        
        JOptionPane.showMessageDialog(null, "Valor digitado não é um código válido!");
        txtValor.requestFocus();
        return false;
    }
    
    /**
     * Veririca primeiro se o valor digitado é um cpf. Caso seja, consulta no banco de dados se existe o funcionário.
     * @return 
     * <b>true</b> - Localizou o funcionário<br/>
     * <b>false</b> - Valor digitado é inválido ou não achou o funcionário<br/>
     */
    public boolean validarCpf(){
        try {
            paciente = new Cliente();
            paciente.setCpf(mascaraCPF.stringToValue(txtValor.getText().trim()).toString());
            paciente = persistePaciente.retornarPacientePeloCPF(paciente);

            if(paciente != null) return true;
            JOptionPane.showMessageDialog(null, "Paciente não cadastrado no sistema!");
            txtValor.requestFocus();
            return false;
        } catch (ParseException ex) {
            JOptionPane.showMessageDialog(null, "Valor digitado é inválido!");
            txtValor.requestFocus();
            return false;
        }
    }
    
    /**
     * Verifica se o campo está vazio. Caso não esteja, consulta no banco de dados se existe o funcionário (usando o like).
     * @return 
     * <b>true</b> - Localizou o funcionário<br/>
     * <b>false</b> - Valor digitado é inválido ou não achou o funcionário<br/>
     */
    public boolean validarNome(){
        if(!txtValor.getText().trim().isEmpty()){
            
            paciente = new Cliente();
            paciente.setNome(txtValor.getText().trim());
            listaPacientes = persistePaciente.retornarClientePeloNome(paciente);
            return true;
        }
        
        JOptionPane.showMessageDialog(null, "Valor digitado é inválido!");
        txtValor.requestFocus();
        return false;
    }
    
    /**
     * Define qual a máscara que ficará no campo txtValor. Caso seja 0 ou 1, não conterá uma máscara
     */
    public void definirMascara(){
        selecao = jComboTipo.getSelectedIndex();
        if(selecao < 2){
            mascaraCPF.uninstall();
            txtValor.setText("");
        }else{
            mascaraCPF.install(txtValor);
        }
    }
    
    
    /**
     * Feita as devidas validações, passamos o funcionário para o formulário de cadastro.
     */
    public void selecionarPaciente(){
        int posicao = Pesquisas.pesquisarNaListaPeloId(
                            cadastroPaciente.listaClientes, paciente);
        
        if(posicao > -1) {
            cadastroPaciente.posicao = posicao;
            cadastroPaciente.exibirCliente();
        }
        this.dispose();
    }
    
    /**
     * Chama a função referente ao tipo selecionado
     */
    public void definirFuncoes(){
        switch(selecao){
            case 0:
                if(validarCodigo()){
                    selecionarPaciente();
                }
                break;
                
            case 1:
                if(validarNome()){
                    //aqui ele vai selecionar o funcionario;
                    SelecionarPaciente selecionarPaciente = new SelecionarPaciente(this, true);
                    selecionarPaciente.setLocationRelativeTo(null);
                    selecionarPaciente.setVisible(true);
                    
                    //se ele selecionar algum, então joga para a tela de cadastro de funcionário.
                    if(paciente != null){
                        selecionarPaciente();
                    }
                }
                break;
            
            case 2:
                if(validarCpf()){
                    selecionarPaciente();
                }
                break;
        }
    }
    
    /**
     * Creates new form ConsultaCliente
     */
    public PesquisarPaciente(JFrame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        inicializarDialog();
    }


    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel4 = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jComboTipo = new javax.swing.JComboBox();
        jPanel2 = new javax.swing.JPanel();
        jLabel2 = new javax.swing.JLabel();
        txtValor = new javax.swing.JFormattedTextField();
        jPanel3 = new javax.swing.JPanel();
        btnPesquisar = new javax.swing.JButton();
        btnSair = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("ERP BEAUTY CENTER - Consultar Clientes");
        setResizable(false);
        addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                formKeyPressed(evt);
            }
        });

        jPanel4.setBackground(new java.awt.Color(255, 255, 255));
        jPanel4.setPreferredSize(new java.awt.Dimension(380, 230));

        jPanel1.setBackground(new java.awt.Color(255, 255, 255));
        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Busca Por"));

        jLabel1.setText("TIPO:");

        jComboTipo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Código", "Nome", "CPF" }));
        jComboTipo.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                jComboTipoItemStateChanged(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jComboTipo, javax.swing.GroupLayout.PREFERRED_SIZE, 189, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(117, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jComboTipo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(0, 12, Short.MAX_VALUE))
        );

        jPanel2.setBackground(new java.awt.Color(255, 255, 255));
        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Valor"));

        jLabel2.setText("VALOR:");

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txtValor, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(txtValor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(14, Short.MAX_VALUE))
        );

        jPanel3.setBackground(new java.awt.Color(255, 255, 255));

        btnPesquisar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/com/beautycenter/img/Pesquisar.png"))); // NOI18N
        btnPesquisar.setToolTipText("PESQUISAR");
        btnPesquisar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnPesquisarActionPerformed(evt);
            }
        });
        jPanel3.add(btnPesquisar);

        btnSair.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/com/beautycenter/img/Sair.png"))); // NOI18N
        btnSair.setToolTipText("SAIR");
        btnSair.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSairActionPerformed(evt);
            }
        });
        jPanel3.add(btnSair);

        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
        jPanel4.setLayout(jPanel4Layout);
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(33, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnPesquisarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnPesquisarActionPerformed
        definirFuncoes();
    }//GEN-LAST:event_btnPesquisarActionPerformed

    private void jComboTipoItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jComboTipoItemStateChanged
        if(jComboTipo.getSelectedIndex() > -1){
            definirMascara();
        }
    }//GEN-LAST:event_jComboTipoItemStateChanged

    private void btnSairActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSairActionPerformed
        this.dispose();
    }//GEN-LAST:event_btnSairActionPerformed

    private void formKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_formKeyPressed
          if (evt.getKeyCode() == KeyEvent.VK_ENTER){
             btnPesquisar.requestFocus();
         }
    }//GEN-LAST:event_formKeyPressed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnPesquisar;
    private javax.swing.JButton btnSair;
    private javax.swing.JComboBox jComboTipo;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JFormattedTextField txtValor;
    // End of variables declaration//GEN-END:variables
}
